package
{

	import Classes.pi_events;
	
	import UIFree.ObjectEvent;
	import UIFree.uif_Timer;
	
	import api_servers.pi_servers;
	
	import com.adobe.serialization.json.JSON;
	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.geom.Rectangle;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.navigateToURL;
	import flash.system.Security;

	[SWF(width="760", height="730", backgroundColor="#FFFFFF")]
	public class top_toolbar extends Sprite {
	    [Embed(source="images/birthday.swf")]
	    [Bindable]
	    private var c_birthday: Class;
	    
	    [Embed(source="images/face.swf")]
	    [Bindable]
	    private var c_face: Class;
	    
		private var _wrapper:*;
		private var _classes: Object;
		private var _toolbar: *;
		private var _outBox: Array;
		private var _serverTime: Date;
		private var _serverUTime: uint;
		private var _friendsAlreadyShow: Boolean = false;
		private var _buttonCount: int;
		private var _curCardTip: int;
		private var _extends: Object;
		private var _tb_isshow: Boolean;
		
		protected static const BIRTHDAYTITLE: String 	= '%s1 день рождение у %s2'; 
		protected static const BIRTHDAYTEXT: String 	= '<b>Отправьте имениннику открытку!</b>\nЕму будет приятно получить от вас знак внимания в такой радостный для него день.'; 
		protected static const NORECEIVED: String 	 	= '%s1 еще не получил%s2 вашу открытку';
		protected static const NORECEIVEDTEXT: String 	= '<b>Ваш друг еще не получил открытку которую вы ему высылали.</b>\nВозможно, он слишком занят, что бы зайти в приложение. А может у него еще приложение не установлено. Тогда пригласите его, ему будет приятно получить от вас знак внимания.\nНапоминаю, что пригласить друга вы можете нажав кнопку «Пригласить друзей» сверху приложения.';
		protected static const FRIENDACTION: String 	= '10 руб. за каждого приглашенного друга, получившего от вас открытку! Подробности...';
		protected static const FRIENDACTIONTEXT: String = '<font size="18" color="#FF0000"><b>Внимание, акция!</b></font>\nЗа каждого вновь приглашенного друга, получившего от вас открытку, вам на счет зачисляется 10 руб.\nОткрытка считается полученной, когда приглашенный друг, откроет ее из приложения в диалоге «входящие открытки»';
		protected static const PAYFROMFRIENDTEXT: String = '<font size="14" color="#00FF00"><b>Вам начислено %s1 рублей за одного, нового друга, </b>который получил от вас открытку!</font>\n' + FRIENDACTIONTEXT;			
		protected static const PAYFROMFRIENDSTEXT: String = '<font size="14" color="#00FF00"><b>Вам начислено %s1 рублей за %s2 новых друзей, </b>которые получили от вас открытки!</font>\n' + FRIENDACTIONTEXT;			
		protected static const PAYFROMFRIENDSTITLE: String = 'Новое поступление';			
		protected static const PAYFROMFRIENDSTEXT2: String = 'Мне начислили %s руб. на счет, за отправленные открытки. Получи и ты прибыль в [url=action~showaction]приложении[/url]';			
		protected static const DAYMSEC: int = 86400000;
		protected static const DAYSEC: int = 86400;
		protected static const MESSAGE: String = 'Сообщение!';
		protected static const WARNING: String = 'Внимание!';
		protected static const TIP: String = 'Подсказка!';
		protected static const STATFRIENDACTION: uint 	= 1269845472; // 29.03.2010
		protected static const FROMFRIENDSERVICE: int 	= 2002;
		protected static const FROMFRIENDPRICE  : int 	= 10;
//		protected static const DATA_URL: String = 'http://game_l.ru/games/data/extends.php'; 
		protected static const DATA_URL: String = pi_servers.ADDR[0] + '/games/data/extends.php';
		protected static const ICON_ID: int = 815; 
		 
		
		public function top_toolbar() {
			Security.allowDomain('*');
			super();
			_curCardTip = 0;
			var loader: URLLoader = new URLLoader(new URLRequest(DATA_URL))
			loader.addEventListener(Event.COMPLETE, function(e: Event): void {
	    		_extends = uif_json.d(loader.data);
	    		startExtends(_extends.start);
	    		changeCard(_curCardTip);
			});
		}
		
		public function init(wrapper: *, extendsLayer: Object = null): void {
			_wrapper 		= wrapper;
			_classes 		= _wrapper.getClasses();
			
			_wrapper.addEventListener(GDataEvent.RESPONSE, doResponse);
			_wrapper.addEventListener('FULLVIEWCHANGE', doFullScreen);
			_wrapper.addEventListener('COMPLETELOADCARD', doCardComplete);
			_wrapper.addEventListener('ACTION', doAPPAction);
			_toolbar = new _classes.toolbar(_wrapper.layers[2], -55, '');
			
			friendAction();
		}
		
		protected function doAPPAction(e: ObjectEvent): void {
			if (e.object == 'showaction')
				pj.alert(WARNING, FRIENDACTIONTEXT);
		}
		
		protected function doResponse(e: *): void {
			if (e.hasOwnProperty('data') && 
				e.data.hasOwnProperty('queryID') && 
				e.data.hasOwnProperty('response') &&
				!e.data.hasOwnProperty('error_code') && 
				!e.data.response.hasOwnProperty('error')) {
				if (e.data.queryID == _classes.data.FRIEND_QUERYID) {
					if (!_friendsAlreadyShow) checkFriends(e.data.response);
				} else if ((e.data.queryID == _classes.data.START_REQUEST) && 
							(e.data.response.response != undefined) &&
							(e.data.response.response[3] is Array)) {
					_outBox = e.data.response.response[3];
					_serverTime = new Date(Math.floor(parseInt(e.data.response.response[4].time) / DAYSEC) * DAYMSEC);
					_serverTime.setHours(0, 0, 0, 0);
					_serverUTime = parseInt(e.data.response.response[4].utime);
					
					// Акция
					// Проверка друзей получивших открытку
					// Получаем друзей получивших открытки до начала акции
					var friends: Object = new Array();
					var newfriends: Object = new Array();
					var newfriendsCount: int = 0;
					var onCard: Object;
					for each (onCard in _outBox) {
						if ((parseInt(onCard.utime) < STATFRIENDACTION) && (onCard.received) && !friends[onCard.sendTo])
							friends[onCard.sendTo] = true;
					}
					
					// Получаем друзей получивших открытки только после начала акции
					for each (onCard in _outBox) {
						if ((parseInt(onCard.utime) >= STATFRIENDACTION) && (onCard.received) && 
							!friends[onCard.sendTo] && !newfriends[onCard.sendTo]) {
							newfriends[onCard.sendTo] = true;
							newfriendsCount++;
						}
					}
					
					var _payFromFriend: int = 0; // Количество начислений за новых друзей
					for each (var pay:Object in e.data.response.response[2]) {
						if (parseInt(pay.service_id) == FROMFRIENDSERVICE)
							_payFromFriend = parseInt(pay.price) / FROMFRIENDPRICE;
					}

					if (_payFromFriend < newfriendsCount) {
						var nf_count: int = newfriendsCount - _payFromFriend;
						var nf_sum: Number = FROMFRIENDPRICE * nf_count;
						pj.transaction(nf_sum, function(): void {
							pj.alert(WARNING, Utils.sprintf((nf_count == 1)?PAYFROMFRIENDTEXT:PAYFROMFRIENDSTEXT, [nf_sum, nf_count]));
							pj.externalserver.streamPublish( 
								pj.classes.data.sprintf(PAYFROMFRIENDSTEXT2, nf_sum),
								PAYFROMFRIENDSTITLE, null,
								'streamPublish', ICON_ID);
						}, FROMFRIENDSERVICE, '');							
					}
					// Конец акции
				}
			}
		}
		
		protected function doCardComplete(e: *): void {
			if (!_wrapper.isFullView) changeCard(e.object.maskInfo.id);
		}
		
		protected function startExtends(start: Object): void {
			if (start && (start.length > 0)) {
				if (!_tb_isshow) initTopToolbar();
				var _this: Object = this;
				for each (var item:Object in start) {
					var button: Object = addButton(c_face, item.title, function(e: MouseEvent): void {
						_this[e.target._data.action](e.target._data.actionParams);
					}, null, 200);
					button._data = item;
				}
				if (!_tb_isshow) showToolbar();
				else _toolbar.refreshButtons();
			}
		}
		
		protected function cardDemo(params: String): void {
			var a_info: Array = params.split('~');
			_wrapper.viewCard(params);
			_wrapper.dispatchEvent(new ObjectEvent(pi_events.SETCURRENTCARD, a_info[0]));
		}
		
		protected function gotoURL(params: String): void {
			navigateToURL(new URLRequest(params), '_blank');
		}
		
		protected function alert(text_message: String): void {
			pj.alert(MESSAGE, text_message);
		}
		
		protected function changeCard(cardID: int): void {
			function cardTip(e: Event=null): void {
				initTopToolbar();
				addButton(c_face, _extends.recommendations[_curCardTip].title, function(e: MouseEvent): void {
					pj.alert(TIP, _extends.recommendations[_curCardTip].description);
				}, null, 270);
				showToolbar(10);
			}
			
			if (_curCardTip != cardID) {	
				if (cardID && _extends && _extends.recommendations[cardID]) {
					_curCardTip = cardID;
					if (!_tb_isshow) cardTip()
					else hideToolbar(cardTip);
				} else if (_curCardTip) {
					_curCardTip = 0;
					hideToolbar();
				}
			}
		}
		
		protected function doFullScreen(e: Event): void {
			if (!_wrapper.isFullView) hideToolbar();
		}
		
		protected function parseServerTime(time: uint): Date {
			return new Date(time * 1000);
		}
		
		protected function friendAction(): void {
			initTopToolbar();
			addButton(c_face, FRIENDACTION, function(e: MouseEvent): void {
				pj.alert(WARNING, FRIENDACTIONTEXT);
			}, null, 270);
			showToolbar();
		}
		
		protected function addButton(c_image: Class, text: String, 
									eventFunc: Function=null, data: Object=null,width:int = 180): Object {
			if (_buttonCount > 3) return null;
			var button: * = new _classes.toolbarButton(_toolbar, c_image, 
							text,  (eventFunc != null)?eventFunc:function(e: MouseEvent): void {
				if (data.birthday)
					pj.alert(WARNING, BIRTHDAYTEXT);
				else pj.alert(WARNING, NORECEIVEDTEXT);
			}, width, 'left');
			_buttonCount++;
			return button;
		}
		
		public function checkFriends(friends: Array): void {
			if (!_friendsAlreadyShow) {
				if (_tb_isshow) {
					hideToolbar(function(e: Event): void {
						checkFriends(friends);
					});
					return;
				}
				initTopToolbar();
				var dayMsg: Array = ['Cегодня', 'Завтра'];
				var noReceived: Object = new Object();
				for each (var outCard: Object in _outBox)
					if ((outCard.received == 0) && !noReceived[outCard.sendTo]) {
						if (_serverUTime <= parseInt(outCard.utime) + DAYSEC)
							noReceived[outCard.sendTo] = outCard;
					}
				
				var userName: String;
				for each (var friend: Object in friends) {
					
					if (friend.birthday) {
						userName = _classes.app.userName(friend);
						var bd: Array = friend.birthday.split('.');
						var bd1: Date = new Date(_serverTime.fullYear, bd[1], bd[0]);
						var delta: int = Math.round((bd1.time - _serverTime.time) / DAYMSEC);
						
						if ((delta >= 0) && (delta < 1)) {
							if (!addButton(c_birthday, Utils.sprintf(BIRTHDAYTITLE, 
									[dayMsg[delta], userName]), null, friend)) break;
						}
						
					}
				}
				for each (friend in friends) {
					userName = _classes.app.userName(friend);
					for each (outCard in noReceived) {
						if (outCard.sendTo == friend.uid) {
							if (!addButton(c_face, Utils.sprintf(NORECEIVED, [userName, friend.sex==0?'':'а']), 
								null, outCard)) break;
						}
					}
				}
				
				if (_buttonCount > 0) {
					showToolbar();
					_friendsAlreadyShow = true;
				}
			}
		}
		
		protected function showToolbar(_delay:int = 5000): void {
			if (_toolbar && (_buttonCount > 0)) {
				_tb_isshow = true;
				_toolbar.refreshButtons();			
				new uif_Timer(_delay, null, function(e: TimerEvent): void {
					if (_tb_isshow) _toolbar.fx('y', -55, 0).start();
				}, 1);
			}
		}
		
		protected function initTopToolbar(): void {
			_toolbar.removeChilds();
			var inner: Rectangle = _toolbar.getInner();
			
			new _classes.closeButton(_toolbar, inner.x + inner.width - 25, 3);
			_toolbar.addEventListener(Event.CLOSE, function(e: Event): void {
				hideToolbar();
			});
			_buttonCount = 0;
		}
		
		protected function hideToolbar(endFunc: Function = null): void {
			_toolbar.fx('y', _toolbar.y, -55).start(endFunc);
			_tb_isshow = false;
		}
		
		public function get pj():* {
			return _wrapper;
		}
	}
}